#!/bin/bash
###############################################################################
# @用例ID: 20241013-114215-757069880
# @用例名称: case_iotop
# @用例级别: 3
# @用例标签:
# @扩展属性:
# @用例类型: 功能测试
# @自动化: 1
# @超时时间: 0
# @用例描述: TODO: 简要描述用例测试的内容
###############################################################################
if [ -z "$TST_TS_TOPDIR" ]; then
    TST_TS_TOPDIR="$(realpath "$(dirname "$0")/..")"
    while [ "$TST_TS_TOPDIR" != "/" ]; do
        [ -f "${TST_TS_TOPDIR}/tsuite" ] && break
        TST_TS_TOPDIR="$(dirname "$TST_TS_TOPDIR")"
    done
    export TST_TS_TOPDIR
fi
source "${TST_TS_TOPDIR}/tst_common/lib/common.sh" || exit 1
###############################################################################

g_tmpdir="$(mktemp -d)"

tc_setup() {
    msg "this is tc_setup"

    # @预置条件: TOD1: 系统正常运行，且已安装iotop软件包
    assert_true yum install -y iotop 
    skip_if_false [ $? -eq 0 ] 
    # @预置条件: TOD2: 系统正常运行，且已安装fio软件包，用于测试iotop能否读出数据
    assert_true yum install -y fio
    skip_if_false [ $? -eq 0 ]
    return 0
}

do_test() {
    msg "this is do_test"

    # @测试步骤: TOD1: 在iotop的非交互模式下将一次数据保存到iotop_test_1.txt中，查看命令是否正确输出内容
    assert_true iotop -b -n 1 > iotop_test_1.txt
    assert_true test -s iotop_test_1.txt
    # @预期结果: TOD1: 当前文件夹下iotop_test_1.txt中存有iotop命令的一次数据，并且可以显示当次数据的前两行，匹配“DISK”，提取出当次的速率，如果为空测试不通过，否则通过
    min_rate=$(grep "DISK" iotop_test_1.txt | awk '{print $10}' | grep "[0-9]" | sort -n | tail -n 1)
    assert_true [ $? -eq 0 ]
    
    assert_true [ -n "$min_rate" ]

    # @测试步骤: TOD2: 通过fio在当前目录下写入一个大小为1G的文件，持续3秒在后台静默运行，通过iotop命令查看是否能够正常对磁盘IO进行监测
    assert_true fio --name=test --filename=$(pwd)/iotop_test_2_1.txt --size=1G --bs=4k --rw=randwrite --ioengine=libaio --direct=1 --runtime=3 --group_reporting > /dev/null 2>&1 &
    assert_true iotop -b -d 1 -n 3 > iotop_test_2_2.txt
    wait %1   
    # @预期结果: TOD2: 这时的磁盘IO数据应该大于1M/s，如果大于则测试成功
    cat iotop_test_2_2.txt | grep DISK | awk '{print $10,$11}' | grep M/s | awk '{print $1}' | sort -n > iotop_test_2_3.txt
    assert_true [ $? -eq 0 ]
    max_rate=$(tail -n 1 iotop_test_2_3.txt | awk '{print $1}')
    assert_true [ $? -eq 0 ]
    result2=$(echo "$max_rate > 1" | bc -l)
    assert_true [ $result2 -eq 1 ]

    return 0
}

tc_teardown() {
    msg "this is tc_teardown"
    rm iotop_test_*.txt
    rm -rfv "$g_tmpdir" || return 1
    return 0
}

###############################################################################
tst_main "$@"
###############################################################################
